#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;  // 示例：元素类型为int，可根据需求修改
#define LIST_INIT_SIZE 5  // 初始容量
#define LIST_INCREMENT 10   // 扩容增量

typedef struct
{
   ElemType *elem;   // 指向元素存储区的指针
   int length;
   int listsize;
}SqList;

// 1. 初始化顺序表：分配初始内存，初始化长度和容量
int InitList_Sq(SqList *L);

// 2. 销毁顺序表：释放动态分配的内存，清空结构体
int DestroyList_Sq(SqList *L);

// 3. 清空顺序表：仅将长度置为0（不释放内存，保留容量）
int ClearList_Sq(SqList *L);

// 4. 判断顺序表是否为空：空表返回1，非空返回0
int ListEmpty_Sq(SqList L);

// 5. 获取顺序表当前长度（元素个数）
int ListLength_Sq(SqList L);

// 6. 获取指定位置的元素：pos为位置（1-based），用e接收元素值，成功返回OK
int GetElem_Sq(SqList *L, int pos, ElemType *e);

// 7. 查找元素位置：返回所有值为e的元素的位置（1-based），未找到返回0
int LocateElem_Sq(SqList *L, ElemType e);

// 8. 在指定位置插入元素：pos为插入位置（1-based），插入e后长度+1，需判断容量并扩容
int ListInsert_Sq(SqList *L, int pos, ElemType e);

// 9. 删除指定位置的元素：pos为删除位置（1-based），用e接收被删除元素，长度-1
int ListDelete_Sq(SqList *L, int pos, ElemType *e);

void printflist(SqList L);


int main()
{
    SqList List;
    ElemType e;
    InitList_Sq(&List);
    ListInsert_Sq(&List,1,1);
    ListInsert_Sq(&List,2,2);
    ListInsert_Sq(&List,3,3);
    ListInsert_Sq(&List,2,9);
    ListDelete_Sq(&List,3,&e);
    printflist(List);

    return 0;
}

int InitList_Sq(SqList *L)
{
    L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if (L->elem==NULL)
    {
        printf("内存分配失败！");
        return -1;
    }
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
}

int DestroyList_Sq(SqList *L)
{
    if (L==NULL)
    {
        printf("错误！");
        return -1;
    }
    if (L->elem != NULL)
    {
       free(L->elem);
       L->elem=NULL;
    }
    L->length=0;
    L->listsize=0;
    return 1;
}
// 3. 清空顺序表：仅将长度置为0（不释放内存，保留容量）
int ClearList_Sq(SqList *L)
{
      if (L==NULL)
    {
        printf("错误！");
        return -1;
    }
    if (L->elem!=NULL)
    {
       L->elem=NULL;
    }
    L->length=0;
    return 1;
}
// 4. 判断顺序表是否为空：空表返回1，非空返回0
int ListEmpty_Sq(SqList L)
{
   return (L.length == 0) ? 1 : 0; 
}

// 8. 在指定位置插入元素：pos为插入位置（1-based），插入e后长度+1，需判断容量并扩容
int ListInsert_Sq(SqList *L, int pos, ElemType e)
{
    if (pos<1 ||pos>L->length+1)
    {
        printf("错误！");
        return -1;
    }
    if (L->length>=L->listsize)
    {
      ElemType *newbase=(ElemType*)realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));
      if (!newbase)
      {
        printf("错误！");
        return -1;
      }
      L->elem=newbase;
      L->listsize=L->listsize+LIST_INCREMENT;
    }
    ElemType *q=&(L->elem[pos-1]);
    for (ElemType *p = &(L->elem[L->length-1]);p>=q; --p)
    {
       *(p+1)=*p;
    }
    *q=e;
    ++L->length;
    return 1;    
}

// 9. 删除指定位置的元素：pos为删除位置（1-based），用e接收被删除元素，长度-1
int ListDelete_Sq(SqList *L, int pos, ElemType *e)
{  
    if (pos<1||pos>L->length)
    {
        printf("错误！");
        return -1;
    }
    ElemType *p=&(L->elem[pos-1]);
    *e=*p;
    ElemType *q=L->elem+L->length-1;
    for (++p;p<=q;++p)
    {
        *(p-1)=*p;
    }
    --L->length;
    return 1;
}

// 7. 查找元素位置：返回所有值为e的元素的位置（1-based），未找到返回0
int LocateElem_Sq(SqList *L, ElemType e)
{
    if (L==NULL)
    {
        printf("错误！");
        return -1;
    }
    int count=0;
    for (int i = 0; i < L->length; i++)
    {
       if (L->elem[i]==e)
       {
        printf("%d\t",i+1);
        count++;
       } 
    }
    return count;
}

// 6. 获取指定位置的元素：pos为位置（1-based），用e接收元素值，成功返回OK
int GetElem_Sq(SqList *L, int pos, ElemType *e)
{
    if (L==NULL)
    {
        printf("错误！");
        return -1;
    }
    if (pos<1||pos>L->length)
    {
       return -1;
    }
    
    *e=L->elem[pos-1];
    return 1;
}

// 5. 获取顺序表当前长度（元素个数）
int ListLength_Sq(SqList L)
 {
    if (L.elem == NULL) 
    {
        printf("错误！");
        return -1; 
    }
    return L.length;
}

void printflist(SqList L)
{
    for (int i = 0; i < L.length; i++)
    {
       printf("%d\t",L.elem[i]);
    }
}

